package 斐波那契数列问题;

import java.util.Scanner;

public class test4 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.next();
        System.out.println(numDecodings(str));
    }

    public static int numDecodings(String s) {
        // dp[i]:以i位置为结尾时,解码方法的总数
        // 根据最近的一步划分问题
        // i自己解码  i和i-1一起解码 所以dp[i] = s[i]次数 + s[i-1]s[i] 单独解码可能会失败(数字为0)
        // 两个解码也可能失败(数字要10~26)
        // dp[i] = dp[i-1]+dp[i-2] --> 两个都成功  dp[i] = 0 --> 两个都失败
        int n = s.length();
        int[] dp = new int[n];
        char[] ch = s.toCharArray();
        if(ch[0]!='0')
            dp[0] = 1;
        if(n==1) return dp[0];

        if(ch[1]!='0' && ch[0] != '0')
            dp[1] = 1;
        int flag = (ch[0]-'0')*10+(ch[1]-'0');
        if(10<=flag&&flag<=26)
            dp[1]+=1;

        for (int i = 2; i < n; i++) {
            if(ch[i]!='0')
                dp[i] = dp[i-1];
            flag = (ch[i-1]-'0')*10+(ch[i]-'0');
            if(10<=flag&&flag<=26)
                dp[i]+=dp[i-2];
        }

        return dp[n-1];
    }


    // 优化
    public static int numDecodings1(String s){
        int n = s.length();
        int[] dp = new int[n+1];
        char[] ch = s.toCharArray();
        dp[0] = 1;
        if(ch[0]!='0')
            dp[1] = 1;
        if(n==1) return dp[1];

        for (int i = 2; i <= n; i++) {
            if(ch[i-1]!='0')
                dp[i] = dp[i-1];
            int flag = (ch[i-2]-'0')*10+(ch[i-1]-'0');
            if(10<=flag&&flag<=26)
                dp[i]+=dp[i-2];
        }
        return dp[n];
    }
}
